#include "FuncionesAuxiliares.h"
#include "Servidor.h"
#include "Mensajes.h"
#include "LockFile.h"
#include <sys/types.h> 	// getpid
#include <sys/wait.h>
#include <unistd.h>		// getpid
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>		
#include <fstream>		// file
#include <string>
#include <cstring>

#define BASEDATOS "../baseDatos.txt"

using namespace std;

int grepBasico() {
	string var = string("grep  'abre' ../baseDatos.txt >> res"); 
	system(var.c_str());
	string line;
	ifstream myfile ("res");
	if (myfile.is_open()) {
		while ( myfile.good() ) {
			getline (myfile,line);
			if (! line.compare(""))
				cout << "VACIA"<< endl;
			cout << line << endl;
		}
		myfile.close();
	}
	system("rm res");
	return 0;
}


void generarResultado(string peticionDato) {
	string nombre = itos((int) getpid());
	string comando = string("grep '");
	comando += peticionDato + string("' ");
	comando += string(BASEDATOS);
	comando += string(" >> ");
	comando += string(nombre);
	
	LockFile lock((char*) BASEDATOS, LECTURA);
	lock.tomarLock();
	
	system(comando.c_str());

	lock.liberarLock();
}


string leerResultado(string nombre, string peticionDato, int tipo) {
	string linea, resultado = "";
	ifstream file (nombre);
	if ( ! file.is_open())
		return "";
	
	// Filtra en caso de que haya muchos resultados
	while ( file.good() ) {
		getline (file,linea);
		string aux = parsearPeticion(linea, tipo);
		cout << "Aux: '"<<aux<<"'"<<endl;
		if ( ! aux.compare(peticionDato) ) {
			resultado = linea;
			cout << "ENTRA EN EL IF" << endl;
		}
	}
	file.close();
	
	return resultado;
}


void parsearPeticion() {
	mensaje peticion;
	peticion.mtype = 0;
	peticion.tipo = PETICION_NOMBRE;
	strcpy(peticion.texto, "Ramon Cabrero&Garibaldi&12344321");
	
	string nombre = itos((int) getpid());
	
	string peticionDato = parsearPeticion(string(peticion.texto), peticion.tipo);
	cout << "Dato: '" << peticionDato << "'" << endl;
	generarResultado(peticionDato);
	string res = leerResultado(nombre, peticionDato, peticion.tipo);
	cout << "Resultado: '"<< res << "'" << endl;
	string comando = string("rm ") + nombre;
	//system(comando.c_str());
}

/* Prueba de una estupidez de procesos.
(léase: no aprendí nada en sisop) */
int prueba_padre_hijo()
{
	int pid = fork();
	
	if(!pid)
	{
		/* proceso hijo */
		cout << "hijo: " << getpid() << endl;
		sleep(2);
		exit(0);
	}
	
	else
	{
		int status;
		waitpid(pid, &status, 0);
		/* proceso padre */
		cout << "padre: " << getpid() << endl;
		for(int i = 0; i < 10; i++)
		{
			cout << "cuento " << i << endl;
			sleep(1);
		}
		exit(0);	
	}

	return 0;
}



int pruebaServidorConcurrente() {
	
	int pid = fork();
	if (pid == 0) {
		cout << "ALTA 1: "<< getpid() << endl;
		system("./procCliente -a -n \"Juan Cangelosi\" -d \"PRUNO 444\" -t 502073 ");
		exit(EXIT_SUCCESS);
	} 
	
	pid = fork();
	if (pid == 0) {
		cout << "ALTA 2: "<< getpid() << endl;
		system("./procCliente -a -n \"Juan Cangelosi\" -d \"PRDOS 444\" -t 502073 ");
		exit(EXIT_SUCCESS);
	}

	pid = fork();
	if (pid == 0) {
		cout << "Consulta 1: "<< getpid() << endl;
		system("./procCliente -c -n \"Juan Cangelosi\" ");
		exit(EXIT_SUCCESS);
	}
	
	pid = fork();
	if (pid == 0) {
		cout << "Consulta 2: "<< getpid() << endl;
		system("./procCliente -c -n \"Juan Cangelosi\" ");
		exit(EXIT_SUCCESS);
	}
	cout << "MODIF 1: "<< getpid() << endl;
	system("./procCliente -m -n \"Juan Cangelosi\" -d \"MODIF 444\" -t 502073 ");

	wait(NULL);
	wait(NULL);
	wait(NULL);
	wait(NULL);
	return 0;
}


int main() {
	//grepBasico();
	//parsearPeticion();
	/*
	int i;
	string ing (" ");
	while ( ! isdigit(ing.c_str()[0]) ) {
		cout << "ingrese un numero: " << endl;
		getline(cin, ing);
	}
	i = atoi(ing.c_str());
	cout << "ingresó el '" << i << "'" << endl;
	*/
	
	pruebaServidorConcurrente();
	
	return 0;
}
